package com.xjh.basestudy.lanqiaobei;

/**
 * 填空题常考：排列组合、进制转换、大数阶乘
 * 遇到大数问题一般是利用稍有难度的数学思维+简单的编程跑答案
 */
public class fill_in_the_blanks {
    public static void main(String[] args) {
        jinzhizhuanhuan();
//        dashu1();

    }

    public static void jinzhizhuanhuan() {
//        Integer.parseInt转10，toString转其他，第二个参数都是特殊的进制
        int binaryString = 1010;
// 先将二进制转换为十进制
        int decimal = Integer.parseInt(String.valueOf(binaryString), 2);
        System.out.println(decimal);
// 再将十进制转换为八进制
        String octalString = Integer.toString(decimal, 8);
        System.out.println(octalString); // 输出: 12


        /**
         * 随着
         * 2024 年的钟声回荡，传说中的时空之门再次敞开。这扇门是一条神秘的通道，它连接着二进制和四进制两个不同的数码领域，等待着勇者们的探索。
         * 在二进制的领域里，勇者的力量被转换成了力量数值的二进制表示中各数位之和。
         * 在四进制的领域里，力量的转换规则相似，变成了力量数值的四进制表示中各数位之和。
         * 穿越这扇时空之门的条件是严苛的：当且仅当勇者在二进制领域的力量等同于四进制领域的力量时，他才能够成功地穿越。
         * 国王选定了小蓝作为领路人，带领着力量值从1 到 2024 的勇者们踏上了这段探索未知的旅程。作为小蓝的助手，你的任务是帮助小蓝计算出，在这2024 位勇者中，有多少人符合穿越时空之门的条件。
         * */
        int count = 0;
        for (int i = 1; i <= 2024; i++) {
            String two = Integer.toString(i,2);
            String four = Integer.toString(i,4);
            char[] twoArr = two.toCharArray();
           int sumTwo = 0;
            for(int j = 0; j < twoArr.length; j++) {
                sumTwo = sumTwo + Integer.parseInt(String.valueOf(twoArr[j]));
            }
            int sumFour = 0;
            char[] fourArr = four.toCharArray();
            for(int k = 0; k < fourArr.length; k++) {
                sumFour = sumFour + Integer.parseInt(String.valueOf(fourArr[k]));
            }
            if(sumTwo == sumFour) {
                count++;
            }

        }
        System.out.println("时空之门"+count);
    }

    public static void dashu1() {
        /**小蓝想要构造出一个长度为 10000 的数字字符串，有以下要求：
         小蓝不喜欢数字 0，所以数字字符串中不可以出现 0；
         小蓝喜欢数字 3 和 7，所以数字字符串中必须要有 3 和 7 这两个数字。
         请问满足题意的数字字符串有多少个？这个数字会很大，你只需要输出其对 10^9 + 7 取余后的结果。*/
//          // 题目要求对 10^9 + 7 取模
        int MOD = 1_000_000_007; //等同于1e9+7
        int N = 10000;
        // 所有由 1~9 组成的字符串总数：9^10000
        long total = power(9, N);

        // 不含数字3的字符串（从1~9中排除3，还剩8个数字）：8^10000
        long no3 = power(8, N);

        // 不含数字7的字符串（同上）：8^10000
        long no7 = power(8, N);

        // 不含3且不含7的字符串（从1~9中排除3和7，剩下7个数字）：7^10000
        long no3no7 = power(7, N);

        // 容斥原理：合法字符串数量 = 全部 - 不含3 - 不含7 + 不含3和7（加是因为多减了一次）
        long result = (total - no3 - no7 + no3no7) % MOD;

        // Java中取模结果可能为负数，需要加MOD让它变正
        if (result < 0) result += MOD;

        // 输出答案
        System.out.println(result);
    }

    // 快速幂计算 (a^b % mod)
    public static long power(long a, long b) {
        int MOD = 1_000_000_007;
        long res = 1;
        a %= MOD; // 先对底数取模，避免溢出
        while (b > 0) {
            if ((b & 1) == 1) { // 如果当前位是1
                res = (res * a) % MOD;
            }
            a = (a * a) % MOD; // 自乘，指数右移
            b >>= 1;
        }
        return res;
    }
}

